@farm.js/core 0.1.0-beta.10 → 0.1.0-beta.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/dist/{chunk-3QDB3IA6.mjs → chunk-3WIRO3N7.mjs} +2 -2
  2. package/dist/chunk-3WIRO3N7.mjs.map +1 -0
  3. package/dist/chunk-53MVSX3R.mjs +168 -0
  4. package/dist/chunk-53MVSX3R.mjs.map +1 -0
  5. package/dist/{chunk-AW6I64AP.mjs → chunk-6ZXIQSXE.mjs} +16 -1
  6. package/dist/chunk-6ZXIQSXE.mjs.map +1 -0
  7. package/dist/chunk-7ZVN3YZI.mjs +333 -0
  8. package/dist/chunk-7ZVN3YZI.mjs.map +1 -0
  9. package/dist/{chunk-7N62DNSO.mjs → chunk-H3TE3LOV.mjs} +2 -2
  10. package/dist/{chunk-QTZZ2ISQ.mjs → chunk-KLA67WKG.mjs} +1 -1
  11. package/dist/chunk-KLA67WKG.mjs.map +1 -0
  12. package/dist/{chunk-K5ZTUF22.mjs → chunk-L2PE36GQ.mjs} +7 -3
  13. package/dist/chunk-L2PE36GQ.mjs.map +1 -0
  14. package/dist/{chunk-4LND3PXF.mjs → chunk-OPHK6OJN.mjs} +513 -48
  15. package/dist/chunk-OPHK6OJN.mjs.map +1 -0
  16. package/dist/chunk-USLFXFFH.mjs +46 -0
  17. package/dist/chunk-USLFXFFH.mjs.map +1 -0
  18. package/dist/{chunk-DTOWEQRV.mjs → chunk-VSDZEB5M.mjs} +368 -103
  19. package/dist/chunk-VSDZEB5M.mjs.map +1 -0
  20. package/dist/{chunk-E2AI2CW7.mjs → chunk-Z3YG4OZT.mjs} +727 -148
  21. package/dist/chunk-Z3YG4OZT.mjs.map +1 -0
  22. package/dist/client.cjs.map +1 -1
  23. package/dist/client.mjs +1 -1
  24. package/dist/{devtools-A22KUJZT.mjs → devtools-GAZ7F3KL.mjs} +4 -3
  25. package/dist/{devtools-A22KUJZT.mjs.map → devtools-GAZ7F3KL.mjs.map} +1 -1
  26. package/dist/docs.cjs +622 -124
  27. package/dist/docs.cjs.map +1 -1
  28. package/dist/docs.mjs +5 -3
  29. package/dist/font.cjs +19 -2
  30. package/dist/font.cjs.map +1 -1
  31. package/dist/font.mjs +7 -3
  32. package/dist/index.cjs +2208 -681
  33. package/dist/index.cjs.map +1 -1
  34. package/dist/index.mjs +27 -19
  35. package/dist/index.mjs.map +1 -1
  36. package/dist/internal/build-runtime.cjs +2035 -517
  37. package/dist/internal/build-runtime.cjs.map +1 -1
  38. package/dist/internal/build-runtime.mjs +13 -10
  39. package/dist/internal/client-runtime.cjs +169 -2
  40. package/dist/internal/client-runtime.cjs.map +1 -1
  41. package/dist/internal/client-runtime.mjs +170 -2
  42. package/dist/internal/client-runtime.mjs.map +1 -1
  43. package/dist/internal/config-runtime.cjs +22 -0
  44. package/dist/internal/config-runtime.cjs.map +1 -1
  45. package/dist/internal/config-runtime.mjs +3 -2
  46. package/dist/internal/metadata-image-runtime.cjs +199 -0
  47. package/dist/internal/metadata-image-runtime.cjs.map +1 -0
  48. package/dist/internal/metadata-image-runtime.mjs +8 -0
  49. package/dist/internal/metadata-image-runtime.mjs.map +1 -0
  50. package/dist/internal/production-runtime.cjs +310 -0
  51. package/dist/internal/production-runtime.cjs.map +1 -1
  52. package/dist/internal/production-runtime.mjs +10 -0
  53. package/dist/internal/production-runtime.mjs.map +1 -1
  54. package/dist/navigation.cjs.map +1 -1
  55. package/dist/navigation.mjs +2 -2
  56. package/dist/plugin.cjs +1523 -340
  57. package/dist/plugin.cjs.map +1 -1
  58. package/dist/plugin.mjs +9 -5
  59. package/dist/server.cjs +1636 -411
  60. package/dist/server.cjs.map +1 -1
  61. package/dist/server.mjs +17 -19
  62. package/dist/server.mjs.map +1 -1
  63. package/dist/version.cjs +1 -1
  64. package/dist/version.cjs.map +1 -1
  65. package/dist/version.mjs +1 -1
  66. package/dist/vite.cjs +1577 -350
  67. package/dist/vite.cjs.map +1 -1
  68. package/dist/vite.mjs +9 -5
  69. package/package.json +10 -1
  70. package/dist/chunk-3QDB3IA6.mjs.map +0 -1
  71. package/dist/chunk-4LND3PXF.mjs.map +0 -1
  72. package/dist/chunk-AW6I64AP.mjs.map +0 -1
  73. package/dist/chunk-DTOWEQRV.mjs.map +0 -1
  74. package/dist/chunk-E2AI2CW7.mjs.map +0 -1
  75. package/dist/chunk-K5ZTUF22.mjs.map +0 -1
  76. package/dist/chunk-QM746KUO.mjs +0 -56
  77. package/dist/chunk-QM746KUO.mjs.map +0 -1
  78. package/dist/chunk-QTZZ2ISQ.mjs.map +0 -1
  79. /package/dist/{chunk-7N62DNSO.mjs.map → chunk-H3TE3LOV.mjs.map} +0 -0
@@ -1,5 +1,5 @@
1
1
  // package.json
2
- var version = "0.1.0-beta.10";
2
+ var version = "0.1.0-beta.13";
3
3
 
4
4
  // src/version.ts
5
5
  var FARM_VERSION = version;
@@ -7,4 +7,4 @@ var FARM_VERSION = version;
7
7
  export {
8
8
  FARM_VERSION
9
9
  };
10
- //# sourceMappingURL=chunk-3QDB3IA6.mjs.map
10
+ //# sourceMappingURL=chunk-3WIRO3N7.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../package.json","../src/version.ts"],"sourcesContent":["{\n \"name\": \"@farm.js/core\",\n \"version\": \"0.1.0-beta.13\",\n \"description\": \"Core Farm.js framework for modern integrated apps\",\n \"keywords\": [\n \"@farm.js/core\",\n \"framework\",\n \"react\",\n \"rsc\",\n \"server-components\",\n \"ssr\",\n \"vite\"\n ],\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/farming-labs/farm.js\",\n \"directory\": \"packages/farm\"\n },\n \"files\": [\n \"dist\",\n \"types\"\n ],\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"typesVersions\": {\n \"*\": {\n \"middleware\": [\n \"./types/middleware.d.ts\",\n \"./dist/middleware.d.ts\"\n ],\n \"version\": [\n \"./dist/version.d.ts\"\n ],\n \"router\": [\n \"./dist/router.d.ts\"\n ],\n \"routes\": [\n \"./dist/routes.d.ts\"\n ],\n \"storage\": [\n \"./dist/storage.d.ts\"\n ],\n \"integrations\": [\n \"./dist/integrations.d.ts\"\n ],\n \"cache\": [\n \"./dist/cache.d.ts\"\n ],\n \"deferred\": [\n \"./dist/deferred.d.ts\"\n ],\n \"after\": [\n \"./dist/after.d.ts\"\n ],\n \"navigation\": [\n \"./dist/navigation.d.ts\"\n ],\n \"headers\": [\n \"./dist/headers.d.ts\"\n ],\n \"docs\": [\n \"./dist/docs.d.ts\"\n ],\n \"markdown\": [\n \"./dist/markdown.d.ts\"\n ],\n \"app-markdown\": [\n \"./dist/app-markdown.d.ts\"\n ],\n \"observability\": [\n \"./dist/observability.d.ts\"\n ],\n \"workflows\": [\n \"./dist/workflows.d.ts\"\n ],\n \"cron\": [\n \"./dist/cron.d.ts\"\n ],\n \"server-fn\": [\n \"./dist/server-fn.d.ts\"\n ],\n \"server-fn/client\": [\n \"./dist/server-fn-client.d.ts\"\n ],\n \"server-action-security\": [\n \"./dist/server-action-security.d.ts\"\n ],\n \"deployment\": [\n \"./dist/deployment.d.ts\"\n ],\n \"env\": [\n \"./dist/env.d.ts\"\n ],\n \"env-types\": [\n \"./dist/env-types.d.ts\"\n ],\n \"environment\": [\n \"./dist/environment.d.ts\"\n ],\n \"environment/vite\": [\n \"./dist/environment/vite.d.ts\"\n ],\n \"font\": [\n \"./dist/font.d.ts\"\n ],\n \"testing\": [\n \"./dist/testing.d.ts\"\n ],\n \"agent-runtime\": [\n \"./dist/agent-runtime.d.ts\"\n ],\n \"image\": [\n \"./types/image.d.ts\",\n \"./dist/image.d.ts\"\n ],\n \"image/server\": [\n \"./dist/image/server.d.ts\"\n ],\n \"image/sharp\": [\n \"./dist/image/sharp.d.ts\"\n ],\n \"i18n\": [\n \"./dist/i18n/index.d.ts\"\n ],\n \"i18n/server\": [\n \"./dist/i18n/server.d.ts\"\n ],\n \"i18n/client\": [\n \"./dist/i18n/client.d.ts\"\n ],\n \"internal/production-runtime\": [\n \"./dist/internal/production-runtime.d.ts\"\n ],\n \"internal/metadata-image-runtime\": [\n \"./dist/internal/metadata-image-runtime.d.ts\"\n ],\n \"internal/client-runtime\": [\n \"./dist/internal/client-runtime.d.ts\"\n ],\n \"internal/build-runtime\": [\n \"./dist/internal/build-runtime.d.ts\"\n ],\n \"internal/config-runtime\": [\n \"./dist/internal/config-runtime.d.ts\"\n ],\n \"internal/production-node-env\": [\n \"./dist/internal/production-node-env.d.ts\"\n ],\n \"config\": [\n \"./dist/config.d.ts\"\n ],\n \"api\": [\n \"./types/api.d.ts\",\n \"./dist/api.d.ts\"\n ],\n \"api/route-manager\": [\n \"./dist/api/route-manager.d.ts\"\n ],\n \"api/runtime\": [\n \"./dist/api/runtime.d.ts\"\n ],\n \"request\": [\n \"./dist/request.d.ts\"\n ],\n \"client\": [\n \"./types/client.d.ts\",\n \"./dist/client.d.ts\"\n ],\n \"server\": [\n \"./dist/server.d.ts\"\n ],\n \"vite\": [\n \"./dist/vite.d.ts\"\n ],\n \"plugin\": [\n \"./dist/plugin.d.ts\"\n ],\n \"query\": [\n \"./dist/query/index.d.ts\"\n ],\n \"*\": [\n \"./dist/*.d.ts\"\n ]\n }\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.cjs\",\n \"default\": \"./dist/index.mjs\"\n },\n \"./version\": {\n \"types\": \"./dist/version.d.ts\",\n \"import\": \"./dist/version.mjs\",\n \"require\": \"./dist/version.cjs\"\n },\n \"./config\": {\n \"types\": \"./dist/config.d.ts\",\n \"import\": \"./dist/config.mjs\",\n \"require\": \"./dist/config.cjs\"\n },\n \"./server\": {\n \"types\": \"./dist/server.d.ts\",\n \"import\": \"./dist/server.mjs\",\n \"require\": \"./dist/server.cjs\"\n },\n \"./client\": {\n \"types\": \"./types/client.d.ts\",\n \"import\": \"./dist/client.mjs\",\n \"require\": \"./dist/client.cjs\"\n },\n \"./storage\": {\n \"types\": \"./dist/storage.d.ts\",\n \"import\": \"./dist/storage.mjs\",\n \"require\": \"./dist/storage.cjs\"\n },\n \"./integrations\": {\n \"types\": \"./dist/integrations.d.ts\",\n \"import\": \"./dist/integrations.mjs\",\n \"require\": \"./dist/integrations.cjs\"\n },\n \"./cache\": {\n \"types\": \"./dist/cache.d.ts\",\n \"import\": \"./dist/cache.mjs\",\n \"require\": \"./dist/cache.cjs\"\n },\n \"./deferred\": {\n \"types\": \"./dist/deferred.d.ts\",\n \"import\": \"./dist/deferred.mjs\",\n \"require\": \"./dist/deferred.cjs\"\n },\n \"./after\": {\n \"types\": \"./dist/after.d.ts\",\n \"import\": \"./dist/after.mjs\",\n \"require\": \"./dist/after.cjs\"\n },\n \"./navigation\": {\n \"types\": \"./dist/navigation.d.ts\",\n \"import\": \"./dist/navigation.mjs\",\n \"require\": \"./dist/navigation.cjs\"\n },\n \"./headers\": {\n \"types\": \"./dist/headers.d.ts\",\n \"import\": \"./dist/headers.mjs\",\n \"require\": \"./dist/headers.cjs\"\n },\n \"./docs\": {\n \"types\": \"./dist/docs.d.ts\",\n \"import\": \"./dist/docs.mjs\",\n \"require\": \"./dist/docs.cjs\"\n },\n \"./markdown\": {\n \"types\": \"./dist/markdown.d.ts\",\n \"import\": \"./dist/markdown.mjs\",\n \"require\": \"./dist/markdown.cjs\"\n },\n \"./app-markdown\": {\n \"types\": \"./dist/app-markdown.d.ts\",\n \"import\": \"./dist/app-markdown.mjs\",\n \"require\": \"./dist/app-markdown.cjs\"\n },\n \"./observability\": {\n \"types\": \"./dist/observability.d.ts\",\n \"import\": \"./dist/observability.mjs\",\n \"require\": \"./dist/observability.cjs\"\n },\n \"./workflows\": {\n \"types\": \"./dist/workflows.d.ts\",\n \"import\": \"./dist/workflows.mjs\",\n \"require\": \"./dist/workflows.cjs\"\n },\n \"./cron\": {\n \"types\": \"./dist/cron.d.ts\",\n \"import\": \"./dist/cron.mjs\",\n \"require\": \"./dist/cron.cjs\"\n },\n \"./server-fn\": {\n \"types\": \"./dist/server-fn.d.ts\",\n \"import\": \"./dist/server-fn.mjs\",\n \"require\": \"./dist/server-fn.cjs\"\n },\n \"./server-fn/client\": {\n \"types\": \"./dist/server-fn-client.d.ts\",\n \"import\": \"./dist/server-fn-client.mjs\",\n \"require\": \"./dist/server-fn-client.cjs\"\n },\n \"./server-query\": {\n \"types\": \"./dist/server-query.d.ts\",\n \"import\": \"./dist/server-query.mjs\",\n \"require\": \"./dist/server-query.cjs\"\n },\n \"./server-query/client\": {\n \"types\": \"./dist/server-query-client.d.ts\",\n \"import\": \"./dist/server-query-client.mjs\",\n \"require\": \"./dist/server-query-client.cjs\"\n },\n \"./server-action-security\": {\n \"types\": \"./dist/server-action-security.d.ts\",\n \"import\": \"./dist/server-action-security.mjs\",\n \"require\": \"./dist/server-action-security.cjs\"\n },\n \"./deployment\": {\n \"types\": \"./dist/deployment.d.ts\",\n \"import\": \"./dist/deployment.mjs\",\n \"require\": \"./dist/deployment.cjs\"\n },\n \"./env\": {\n \"types\": \"./dist/env.d.ts\",\n \"import\": \"./dist/env.mjs\",\n \"require\": \"./dist/env.cjs\"\n },\n \"./env-types\": {\n \"types\": \"./dist/env-types.d.ts\",\n \"import\": \"./dist/env-types.mjs\",\n \"require\": \"./dist/env-types.cjs\"\n },\n \"./environment\": {\n \"types\": \"./dist/environment.d.ts\",\n \"import\": \"./dist/environment.mjs\",\n \"require\": \"./dist/environment.cjs\"\n },\n \"./environment/vite\": {\n \"types\": \"./dist/environment/vite.d.ts\",\n \"import\": \"./dist/environment/vite.mjs\",\n \"require\": \"./dist/environment/vite.cjs\"\n },\n \"./font\": {\n \"types\": \"./dist/font.d.ts\",\n \"import\": \"./dist/font.mjs\",\n \"require\": \"./dist/font.cjs\"\n },\n \"./vite\": {\n \"types\": \"./dist/vite.d.ts\",\n \"import\": \"./dist/vite.mjs\",\n \"require\": \"./dist/vite.cjs\"\n },\n \"./plugin\": {\n \"types\": \"./dist/plugin.d.ts\",\n \"import\": \"./dist/plugin.mjs\",\n \"require\": \"./dist/plugin.cjs\"\n },\n \"./plugin/server\": {\n \"types\": \"./dist/server-plugins.d.ts\",\n \"import\": \"./dist/server-plugins.mjs\",\n \"require\": \"./dist/server-plugins.cjs\"\n },\n \"./plugin/client\": {\n \"types\": \"./dist/client-plugins.d.ts\",\n \"import\": \"./dist/client-plugins.mjs\",\n \"require\": \"./dist/client-plugins.cjs\"\n },\n \"./query\": {\n \"types\": \"./dist/query/index.d.ts\",\n \"import\": \"./dist/query/index.mjs\",\n \"require\": \"./dist/query/index.cjs\"\n },\n \"./query/parsers\": {\n \"types\": \"./dist/query/parsers.d.ts\",\n \"import\": \"./dist/query/parsers.mjs\",\n \"require\": \"./dist/query/parsers.cjs\"\n },\n \"./query/client\": {\n \"types\": \"./dist/query/client.d.ts\",\n \"import\": \"./dist/query/client.mjs\",\n \"require\": \"./dist/query/client.cjs\"\n },\n \"./query/server\": {\n \"types\": \"./dist/query/server.d.ts\",\n \"import\": \"./dist/query/server.mjs\",\n \"require\": \"./dist/query/server.cjs\"\n },\n \"./middleware\": {\n \"types\": \"./dist/middleware.d.ts\",\n \"import\": \"./dist/middleware.mjs\",\n \"require\": \"./dist/middleware.cjs\"\n },\n \"./api\": {\n \"types\": \"./dist/api.d.ts\",\n \"import\": \"./dist/api.mjs\",\n \"require\": \"./dist/api.cjs\"\n },\n \"./api/route-manager\": {\n \"types\": \"./dist/api/route-manager.d.ts\",\n \"import\": \"./dist/api/route-manager.mjs\",\n \"require\": \"./dist/api/route-manager.cjs\"\n },\n \"./api/runtime\": {\n \"types\": \"./dist/api/runtime.d.ts\",\n \"import\": \"./dist/api/runtime.mjs\",\n \"require\": \"./dist/api/runtime.cjs\"\n },\n \"./request\": {\n \"types\": \"./dist/request.d.ts\",\n \"import\": \"./dist/request.mjs\",\n \"require\": \"./dist/request.cjs\"\n },\n \"./router\": {\n \"types\": \"./dist/router.d.ts\",\n \"import\": \"./dist/router.mjs\",\n \"require\": \"./dist/router.cjs\"\n },\n \"./routes\": {\n \"types\": \"./dist/routes.d.ts\",\n \"import\": \"./dist/routes.mjs\",\n \"require\": \"./dist/routes.cjs\"\n },\n \"./testing\": {\n \"types\": \"./dist/testing.d.ts\",\n \"import\": \"./dist/testing.mjs\",\n \"require\": \"./dist/testing.cjs\"\n },\n \"./agent-runtime\": {\n \"types\": \"./dist/agent-runtime.d.ts\",\n \"import\": \"./dist/agent-runtime.mjs\",\n \"require\": \"./dist/agent-runtime.cjs\"\n },\n \"./image\": {\n \"types\": \"./types/image.d.ts\",\n \"import\": \"./dist/image.mjs\",\n \"require\": \"./dist/image.cjs\"\n },\n \"./image/server\": {\n \"types\": \"./dist/image/server.d.ts\",\n \"import\": \"./dist/image/server.mjs\",\n \"require\": \"./dist/image/server.cjs\"\n },\n \"./image/sharp\": {\n \"types\": \"./dist/image/sharp.d.ts\",\n \"import\": \"./dist/image/sharp.mjs\",\n \"require\": \"./dist/image/sharp.cjs\"\n },\n \"./i18n\": {\n \"types\": \"./dist/i18n/index.d.ts\",\n \"import\": \"./dist/i18n/index.mjs\",\n \"require\": \"./dist/i18n/index.cjs\"\n },\n \"./i18n/server\": {\n \"types\": \"./dist/i18n/server.d.ts\",\n \"import\": \"./dist/i18n/server.mjs\",\n \"require\": \"./dist/i18n/server.cjs\"\n },\n \"./i18n/client\": {\n \"types\": \"./dist/i18n/client.d.ts\",\n \"import\": \"./dist/i18n/client.mjs\",\n \"require\": \"./dist/i18n/client.cjs\"\n },\n \"./internal/production-runtime\": {\n \"types\": \"./dist/internal/production-runtime.d.ts\",\n \"import\": \"./dist/internal/production-runtime.mjs\",\n \"require\": \"./dist/internal/production-runtime.cjs\"\n },\n \"./internal/metadata-image-runtime\": {\n \"types\": \"./dist/internal/metadata-image-runtime.d.ts\",\n \"import\": \"./dist/internal/metadata-image-runtime.mjs\",\n \"require\": \"./dist/internal/metadata-image-runtime.cjs\"\n },\n \"./internal/client-runtime\": {\n \"types\": \"./dist/internal/client-runtime.d.ts\",\n \"import\": \"./dist/internal/client-runtime.mjs\",\n \"require\": \"./dist/internal/client-runtime.cjs\"\n },\n \"./internal/build-runtime\": {\n \"types\": \"./dist/internal/build-runtime.d.ts\",\n \"import\": \"./dist/internal/build-runtime.mjs\",\n \"require\": \"./dist/internal/build-runtime.cjs\"\n },\n \"./internal/config-runtime\": {\n \"types\": \"./dist/internal/config-runtime.d.ts\",\n \"import\": \"./dist/internal/config-runtime.mjs\",\n \"require\": \"./dist/internal/config-runtime.cjs\"\n },\n \"./internal/production-node-env\": {\n \"types\": \"./dist/internal/production-node-env.d.ts\",\n \"import\": \"./dist/internal/production-node-env.mjs\",\n \"require\": \"./dist/internal/production-node-env.cjs\"\n }\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"build:runtime\": \"tsup --config tsup.runtime.config.ts\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest run\",\n \"test:coverage\": \"vitest --coverage\",\n \"lint\": \"biome lint .\",\n \"lint:fix\": \"biome lint --write .\",\n \"format\": \"biome format --write .\",\n \"type-check\": \"tsc --noEmit\",\n \"clean\": \"rm -rf dist\"\n },\n \"dependencies\": {\n \"@farming-labs/docs\": \"^0.2.44\",\n \"@farming-labs/orm\": \"0.0.62\",\n \"@farming-labs/orm-runtime\": \"0.0.62\",\n \"@formatjs/icu-messageformat-parser\": \"3.5.15\",\n \"@mdx-js/mdx\": \"^3.1.1\",\n \"@scalar/api-reference\": \"^1.38.1\",\n \"@scalar/openapi-parser\": \"^0.22.3\",\n \"@tailwindcss/vite\": \"4.1.18\",\n \"@vercel/og\": \"0.11.1\",\n \"@vitejs/plugin-react\": \"^4.2.1\",\n \"better-call\": \"^1.0.19\",\n \"db0\": \"^0.3.4\",\n \"esbuild\": \"^0.28.0\",\n \"fast-glob\": \"^3.3.2\",\n \"h3\": \"2.0.1-rc.5\",\n \"image-size\": \"^2.0.2\",\n \"intl-messageformat\": \"11.2.12\",\n \"marked\": \"^12.0.2\",\n \"nitro\": \"3.0.1-alpha.0\",\n \"pg\": \"^8.20.0\",\n \"picocolors\": \"^1.0.0\",\n \"remark-gfm\": \"^4.0.1\",\n \"sirv\": \"^2.0.4\",\n \"sugar-high\": \"^0.9.5\",\n \"supports-color\": \"^10.2.2\",\n \"tailwindcss\": \"4.1.18\",\n \"unstorage\": \"^2.0.0-alpha.3\",\n \"vite\": \"^5.0.10\",\n \"zod\": \"^4.1.12\"\n },\n \"devDependencies\": {\n \"@clerk/react\": \"^6.1.0\",\n \"@types/react\": \"^18.2.45\",\n \"@types/react-dom\": \"^18.2.18\",\n \"@vitest/coverage-v8\": \"^1.1.0\",\n \"jsdom\": \"^25.0.0\",\n \"react\": \"19.2.8\",\n \"react-dom\": \"19.2.8\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"^5.3.3\",\n \"vitest\": \"^1.1.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^18.2.0 || ^19.0.0\",\n \"react-dom\": \"^18.2.0 || ^19.0.0\"\n },\n \"optionalDependencies\": {\n \"rolldown\": \"1.2.0\",\n \"sharp\": \"^0.34.5\",\n \"vite-rolldown\": \"npm:vite@8.1.5\"\n }\n}\n","import { version } from \"../package.json\";\n\nexport const FARM_VERSION = version;\n"],"mappings":";AAEE,cAAW;;;ACAN,IAAM,eAAe;","names":[]}
@@ -0,0 +1,168 @@
1
+ import {
2
+ __name
3
+ } from "./chunk-CGILA3WO.mjs";
4
+
5
+ // src/metadata-image.ts
6
+ import React from "react";
7
+ import { renderToStaticMarkup } from "react-dom/server";
8
+ var REACT_FORWARD_REF_TYPE = /* @__PURE__ */ Symbol.for("react.forward_ref");
9
+ var REACT_MEMO_TYPE = /* @__PURE__ */ Symbol.for("react.memo");
10
+ var REACT_LAZY_TYPE = /* @__PURE__ */ Symbol.for("react.lazy");
11
+ function isResponse(value) {
12
+ return typeof Response !== "undefined" && (value instanceof Response || Boolean(
13
+ value && typeof value === "object" && typeof value.arrayBuffer === "function" && value.headers
14
+ ));
15
+ }
16
+ __name(isResponse, "isResponse");
17
+ function isThenable(value) {
18
+ return Boolean(
19
+ value && (typeof value === "object" || typeof value === "function") && typeof value.then === "function"
20
+ );
21
+ }
22
+ __name(isThenable, "isThenable");
23
+ async function prepareMetadataImageNode(node) {
24
+ if (isThenable(node)) {
25
+ return prepareMetadataImageNode(await node);
26
+ }
27
+ if (Array.isArray(node)) {
28
+ return Promise.all(node.map((child) => prepareMetadataImageNode(child)));
29
+ }
30
+ if (!React.isValidElement(node)) {
31
+ return node;
32
+ }
33
+ const element = node;
34
+ const type = element.type;
35
+ const props = element.props || {};
36
+ if (typeof type === "function") {
37
+ if (type.prototype?.isReactComponent) {
38
+ throw new Error(
39
+ "Metadata image components must be stateless function components; React class components are not supported."
40
+ );
41
+ }
42
+ return prepareMetadataImageNode(await type(props));
43
+ }
44
+ if (type && typeof type === "object") {
45
+ if (type.$$typeof === REACT_MEMO_TYPE) {
46
+ return prepareMetadataImageNode(React.createElement(type.type, props));
47
+ }
48
+ if (type.$$typeof === REACT_FORWARD_REF_TYPE) {
49
+ return prepareMetadataImageNode(await type.render(props, null));
50
+ }
51
+ if (type.$$typeof === REACT_LAZY_TYPE) {
52
+ return prepareMetadataImageNode(React.createElement(type._init(type._payload), props));
53
+ }
54
+ }
55
+ const preparedChildren = await prepareMetadataImageNode(props.children);
56
+ const preparedProps = { ...props };
57
+ if (typeof preparedProps.className === "string") {
58
+ preparedProps.tw = [preparedProps.tw, preparedProps.className].filter(Boolean).join(" ");
59
+ delete preparedProps.className;
60
+ }
61
+ delete preparedProps.children;
62
+ return React.createElement(type, {
63
+ ...preparedProps,
64
+ key: element.key,
65
+ children: preparedChildren
66
+ });
67
+ }
68
+ __name(prepareMetadataImageNode, "prepareMetadataImageNode");
69
+ async function normalizeFonts(fonts) {
70
+ if (!fonts?.length) return void 0;
71
+ return Promise.all(
72
+ fonts.map(async (font) => {
73
+ const data = await font.data;
74
+ const arrayBuffer = ArrayBuffer.isView(data) ? toArrayBuffer(data) : data;
75
+ return { ...font, data: arrayBuffer };
76
+ })
77
+ );
78
+ }
79
+ __name(normalizeFonts, "normalizeFonts");
80
+ function resolveCacheControl(revalidate) {
81
+ if (revalidate === false) {
82
+ return "public, max-age=31536000, immutable";
83
+ }
84
+ if (typeof revalidate === "number" && Number.isFinite(revalidate) && revalidate > 0) {
85
+ return `public, s-maxage=${Math.floor(revalidate)}, stale-while-revalidate=300`;
86
+ }
87
+ return "public, max-age=0, must-revalidate";
88
+ }
89
+ __name(resolveCacheControl, "resolveCacheControl");
90
+ function toArrayBuffer(value) {
91
+ if (value instanceof ArrayBuffer) return value;
92
+ const bytes = new Uint8Array(value.byteLength);
93
+ bytes.set(new Uint8Array(value.buffer, value.byteOffset, value.byteLength));
94
+ return bytes.buffer;
95
+ }
96
+ __name(toArrayBuffer, "toArrayBuffer");
97
+ async function createEntityTag(body) {
98
+ const digest = await globalThis.crypto.subtle.digest("SHA-256", body);
99
+ const hash = Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, "0")).join("").slice(0, 32);
100
+ return `"${hash}"`;
101
+ }
102
+ __name(createEntityTag, "createEntityTag");
103
+ async function finalizeMetadataImageResponse(body, headers, options) {
104
+ const responseHeaders = new Headers(headers);
105
+ const etag = await createEntityTag(body);
106
+ responseHeaders.set("ETag", etag);
107
+ responseHeaders.set("Content-Length", String(body.byteLength));
108
+ responseHeaders.set("X-Content-Type-Options", "nosniff");
109
+ const matchesEntityTag = options.ifNoneMatch?.trim() === "*" || options.ifNoneMatch?.split(",").some((candidate) => candidate.trim().replace(/^W\//, "") === etag);
110
+ if (matchesEntityTag) {
111
+ return new Response(null, { status: 304, headers: responseHeaders });
112
+ }
113
+ return new Response(options.method?.toUpperCase() === "HEAD" ? null : body, {
114
+ status: 200,
115
+ headers: responseHeaders
116
+ });
117
+ }
118
+ __name(finalizeMetadataImageResponse, "finalizeMetadataImageResponse");
119
+ async function createFarmMetadataImageResponse(value, imageModule, options = {}) {
120
+ const method = (options.method || "GET").toUpperCase();
121
+ if (method !== "GET" && method !== "HEAD") {
122
+ return new Response(null, { status: 405, headers: { Allow: "GET, HEAD" } });
123
+ }
124
+ if (isResponse(value)) {
125
+ return method === "HEAD" ? new Response(null, { status: value.status, headers: value.headers }) : value;
126
+ }
127
+ const cacheControl = resolveCacheControl(imageModule.revalidate);
128
+ const explicitContentType = imageModule.contentType?.split(";", 1)[0]?.trim().toLowerCase();
129
+ if (React.isValidElement(value) && explicitContentType !== "image/svg+xml") {
130
+ const { ImageResponse } = await import("@vercel/og");
131
+ const element = await prepareMetadataImageNode(value);
132
+ const response = new ImageResponse(element, {
133
+ width: imageModule.size?.width || 1200,
134
+ height: imageModule.size?.height || 630,
135
+ fonts: await normalizeFonts(imageModule.fonts),
136
+ emoji: imageModule.emoji,
137
+ debug: imageModule.debug,
138
+ headers: { "cache-control": cacheControl }
139
+ });
140
+ const headers = new Headers(response.headers);
141
+ headers.set("Cache-Control", cacheControl);
142
+ return finalizeMetadataImageResponse(await response.arrayBuffer(), headers, options);
143
+ }
144
+ let body;
145
+ if (typeof value === "string") {
146
+ body = toArrayBuffer(new TextEncoder().encode(value));
147
+ } else if (value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {
148
+ body = toArrayBuffer(value);
149
+ } else if (React.isValidElement(value)) {
150
+ body = toArrayBuffer(new TextEncoder().encode(renderToStaticMarkup(value)));
151
+ } else {
152
+ throw new Error("Metadata image must return a Response, string, bytes, or React element");
153
+ }
154
+ return finalizeMetadataImageResponse(
155
+ body,
156
+ {
157
+ "Content-Type": imageModule.contentType || "image/svg+xml; charset=utf-8",
158
+ "Cache-Control": cacheControl
159
+ },
160
+ options
161
+ );
162
+ }
163
+ __name(createFarmMetadataImageResponse, "createFarmMetadataImageResponse");
164
+
165
+ export {
166
+ createFarmMetadataImageResponse
167
+ };
168
+ //# sourceMappingURL=chunk-53MVSX3R.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/metadata-image.ts"],"sourcesContent":["import React from \"react\";\nimport { renderToStaticMarkup } from \"react-dom/server\";\nimport type { ImageResponseOptions } from \"@vercel/og\";\n\nconst REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\");\nconst REACT_MEMO_TYPE = Symbol.for(\"react.memo\");\nconst REACT_LAZY_TYPE = Symbol.for(\"react.lazy\");\n\ntype MetadataImageSize = {\n width?: number;\n height?: number;\n};\n\ntype MetadataImageFont = Omit<NonNullable<ImageResponseOptions[\"fonts\"]>[number], \"data\"> & {\n data: ArrayBuffer | ArrayBufferView | Promise<ArrayBuffer | ArrayBufferView>;\n};\n\nexport type FarmMetadataImageModule = {\n size?: MetadataImageSize;\n contentType?: string;\n revalidate?: number | false;\n fonts?: MetadataImageFont[];\n emoji?: ImageResponseOptions[\"emoji\"];\n debug?: boolean;\n};\n\nexport type FarmMetadataImageResponseOptions = {\n method?: string;\n ifNoneMatch?: string | null;\n};\n\nfunction isResponse(value: unknown): value is Response {\n return (\n typeof Response !== \"undefined\" &&\n (value instanceof Response ||\n Boolean(\n value &&\n typeof value === \"object\" &&\n typeof (value as Response).arrayBuffer === \"function\" &&\n (value as Response).headers,\n ))\n );\n}\n\nfunction isThenable(value: unknown): value is PromiseLike<unknown> {\n return Boolean(\n value &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n typeof (value as PromiseLike<unknown>).then === \"function\",\n );\n}\n\nasync function prepareMetadataImageNode(node: unknown): Promise<unknown> {\n if (isThenable(node)) {\n return prepareMetadataImageNode(await node);\n }\n\n if (Array.isArray(node)) {\n return Promise.all(node.map((child) => prepareMetadataImageNode(child)));\n }\n\n if (!React.isValidElement(node)) {\n return node;\n }\n\n const element = node as React.ReactElement<Record<string, unknown>>;\n const type = element.type as any;\n const props = element.props || {};\n\n if (typeof type === \"function\") {\n if (type.prototype?.isReactComponent) {\n throw new Error(\n \"Metadata image components must be stateless function components; React class components are not supported.\",\n );\n }\n return prepareMetadataImageNode(await type(props));\n }\n\n if (type && typeof type === \"object\") {\n if (type.$$typeof === REACT_MEMO_TYPE) {\n return prepareMetadataImageNode(React.createElement(type.type, props));\n }\n if (type.$$typeof === REACT_FORWARD_REF_TYPE) {\n return prepareMetadataImageNode(await type.render(props, null));\n }\n if (type.$$typeof === REACT_LAZY_TYPE) {\n return prepareMetadataImageNode(React.createElement(type._init(type._payload), props));\n }\n }\n\n const preparedChildren = await prepareMetadataImageNode(props.children);\n const preparedProps: Record<string, unknown> = { ...props };\n\n if (typeof preparedProps.className === \"string\") {\n preparedProps.tw = [preparedProps.tw, preparedProps.className].filter(Boolean).join(\" \");\n delete preparedProps.className;\n }\n delete preparedProps.children;\n\n return React.createElement(type, {\n ...preparedProps,\n key: element.key,\n children: preparedChildren,\n });\n}\n\nasync function normalizeFonts(\n fonts: MetadataImageFont[] | undefined,\n): Promise<ImageResponseOptions[\"fonts\"] | undefined> {\n if (!fonts?.length) return undefined;\n\n return Promise.all(\n fonts.map(async (font) => {\n const data = await font.data;\n const arrayBuffer = ArrayBuffer.isView(data) ? toArrayBuffer(data) : data;\n return { ...font, data: arrayBuffer } as NonNullable<ImageResponseOptions[\"fonts\"]>[number];\n }),\n );\n}\n\nfunction resolveCacheControl(revalidate: number | false | undefined): string {\n if (revalidate === false) {\n return \"public, max-age=31536000, immutable\";\n }\n if (typeof revalidate === \"number\" && Number.isFinite(revalidate) && revalidate > 0) {\n return `public, s-maxage=${Math.floor(revalidate)}, stale-while-revalidate=300`;\n }\n return \"public, max-age=0, must-revalidate\";\n}\n\nfunction toArrayBuffer(value: ArrayBuffer | ArrayBufferView): ArrayBuffer {\n if (value instanceof ArrayBuffer) return value;\n const bytes = new Uint8Array(value.byteLength);\n bytes.set(new Uint8Array(value.buffer, value.byteOffset, value.byteLength));\n return bytes.buffer;\n}\n\nasync function createEntityTag(body: ArrayBuffer): Promise<string> {\n const digest = await globalThis.crypto.subtle.digest(\"SHA-256\", body);\n const hash = Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\")\n .slice(0, 32);\n return `\"${hash}\"`;\n}\n\nasync function finalizeMetadataImageResponse(\n body: ArrayBuffer,\n headers: HeadersInit,\n options: FarmMetadataImageResponseOptions,\n): Promise<Response> {\n const responseHeaders = new Headers(headers);\n const etag = await createEntityTag(body);\n responseHeaders.set(\"ETag\", etag);\n responseHeaders.set(\"Content-Length\", String(body.byteLength));\n responseHeaders.set(\"X-Content-Type-Options\", \"nosniff\");\n\n const matchesEntityTag =\n options.ifNoneMatch?.trim() === \"*\" ||\n options.ifNoneMatch\n ?.split(\",\")\n .some((candidate) => candidate.trim().replace(/^W\\//, \"\") === etag);\n if (matchesEntityTag) {\n return new Response(null, { status: 304, headers: responseHeaders });\n }\n\n return new Response(options.method?.toUpperCase() === \"HEAD\" ? null : body, {\n status: 200,\n headers: responseHeaders,\n });\n}\n\n/** @internal */\nexport async function createFarmMetadataImageResponse(\n value: unknown,\n imageModule: FarmMetadataImageModule,\n options: FarmMetadataImageResponseOptions = {},\n): Promise<Response> {\n const method = (options.method || \"GET\").toUpperCase();\n if (method !== \"GET\" && method !== \"HEAD\") {\n return new Response(null, { status: 405, headers: { Allow: \"GET, HEAD\" } });\n }\n\n if (isResponse(value)) {\n return method === \"HEAD\"\n ? new Response(null, { status: value.status, headers: value.headers })\n : value;\n }\n\n const cacheControl = resolveCacheControl(imageModule.revalidate);\n const explicitContentType = imageModule.contentType?.split(\";\", 1)[0]?.trim().toLowerCase();\n\n if (React.isValidElement(value) && explicitContentType !== \"image/svg+xml\") {\n const { ImageResponse } = await import(\"@vercel/og\");\n const element = (await prepareMetadataImageNode(value)) as React.ReactElement;\n const response = new ImageResponse(element, {\n width: imageModule.size?.width || 1200,\n height: imageModule.size?.height || 630,\n fonts: await normalizeFonts(imageModule.fonts),\n emoji: imageModule.emoji,\n debug: imageModule.debug,\n headers: { \"cache-control\": cacheControl },\n });\n const headers = new Headers(response.headers);\n headers.set(\"Cache-Control\", cacheControl);\n return finalizeMetadataImageResponse(await response.arrayBuffer(), headers, options);\n }\n\n let body: ArrayBuffer;\n if (typeof value === \"string\") {\n body = toArrayBuffer(new TextEncoder().encode(value));\n } else if (value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {\n body = toArrayBuffer(value);\n } else if (React.isValidElement(value)) {\n body = toArrayBuffer(new TextEncoder().encode(renderToStaticMarkup(value)));\n } else {\n throw new Error(\"Metadata image must return a Response, string, bytes, or React element\");\n }\n\n return finalizeMetadataImageResponse(\n body,\n {\n \"Content-Type\": imageModule.contentType || \"image/svg+xml; charset=utf-8\",\n \"Cache-Control\": cacheControl,\n },\n options,\n );\n}\n"],"mappings":"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","names":[]}
@@ -3,6 +3,19 @@ import {
3
3
  } from "./chunk-CGILA3WO.mjs";
4
4
 
5
5
  // src/font.ts
6
+ function defineLayoutFonts(fonts) {
7
+ return fonts;
8
+ }
9
+ __name(defineLayoutFonts, "defineLayoutFonts");
10
+ function resolveFarmLayoutFonts(layouts) {
11
+ let resolved;
12
+ for (const layout of layouts) {
13
+ if (!layout.fonts) continue;
14
+ resolved = { ...resolved, ...layout.fonts };
15
+ }
16
+ return resolved;
17
+ }
18
+ __name(resolveFarmLayoutFonts, "resolveFarmLayoutFonts");
6
19
  function fontCompilerError(loader) {
7
20
  throw new Error(
8
21
  `[Farm fonts] ${loader}() must be called at module scope with static options and compiled by the Farm Vite plugin.`
@@ -19,7 +32,9 @@ function remoteFont(_options) {
19
32
  __name(remoteFont, "remoteFont");
20
33
 
21
34
  export {
35
+ defineLayoutFonts,
36
+ resolveFarmLayoutFonts,
22
37
  localFont,
23
38
  remoteFont
24
39
  };
25
- //# sourceMappingURL=chunk-AW6I64AP.mjs.map
40
+ //# sourceMappingURL=chunk-6ZXIQSXE.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/font.ts"],"sourcesContent":["export type FarmFontDisplay = \"auto\" | \"block\" | \"swap\" | \"fallback\" | \"optional\";\n\nexport interface FarmFontSource {\n /** Local file path or remote URL, depending on the loader. */\n path: string;\n /** A fixed weight (`400`) or variable range (`100 900`). */\n weight?: number | string;\n /** Font style for this source. */\n style?: string;\n /** Optional CSS unicode-range descriptor. */\n unicodeRange?: string;\n}\n\nexport interface FarmFontOptions {\n /** CSS font-family name. */\n family: string;\n /** A fixed weight (`400`) or variable range (`100 900`). */\n weight?: number | string;\n /** Font style. @default \"normal\" */\n style?: string;\n /** Browser loading behavior. @default \"swap\" */\n display?: FarmFontDisplay;\n /** CSS custom property populated by `variable`, for example `--font-sans`. */\n variable?: `--${string}`;\n /** Fallback family names appended to the generated stack. */\n fallback?: string[];\n /** Emit font preload hints. @default true */\n preload?: boolean;\n}\n\nexport interface LocalFontOptions extends FarmFontOptions {\n /**\n * A file relative to this module, a package font specifier, or explicit\n * sources for a multi-weight family.\n */\n src: string | FarmFontSource[];\n}\n\nexport interface RemoteFontSource extends FarmFontSource {\n /** Optional integrity value for this source. Overrides the family-level value. */\n integrity?: string;\n}\n\nexport interface RemoteFontOptions extends FarmFontOptions {\n /** HTTPS font URL, or explicit remote sources for a multi-weight family. */\n src: string | RemoteFontSource[];\n /** Download and fingerprint the font during the build, or retain its URL. */\n strategy?: \"self-host\" | \"external\";\n /** Optional Subresource Integrity value checked while self-hosting. */\n integrity?: string;\n}\n\nexport interface FarmFont {\n /** Generated class that applies the font family and fallback stack. */\n className: string;\n /** Generated class that defines the configured CSS custom property. */\n variable: string;\n /** Inline-style equivalent of the generated family. */\n style: Readonly<{\n fontFamily: string;\n fontStyle?: string;\n fontWeight?: number | string;\n }>;\n /** Compiled resources that should be preloaded when this font is selected. */\n preloads: readonly Readonly<{\n href: string;\n type: string;\n }>[];\n}\n\n/** Semantic font roles inherited by framework-owned surfaces such as Farm Docs. */\nexport interface FarmLayoutFonts {\n /** Default text and prose font. */\n body?: FarmFont;\n /** Code, keyboard input, and other technical UI font. */\n code?: FarmFont;\n}\n\nexport interface FarmLayoutFontModule {\n fonts?: FarmLayoutFonts;\n}\n\n/**\n * Define the semantic fonts exported by a layout.\n *\n * Layouts are resolved from the root toward the requested route. A nearer\n * layout overrides only the roles it defines, so it can replace `body` while\n * continuing to inherit `code` from a parent layout.\n */\nexport function defineLayoutFonts<const T extends FarmLayoutFonts>(fonts: T): T {\n return fonts;\n}\n\n/** Resolve semantic font roles from root layout to nearest layout. */\nexport function resolveFarmLayoutFonts(\n layouts: readonly FarmLayoutFontModule[],\n): FarmLayoutFonts | undefined {\n let resolved: FarmLayoutFonts | undefined;\n\n for (const layout of layouts) {\n if (!layout.fonts) continue;\n resolved = { ...resolved, ...layout.fonts };\n }\n\n return resolved;\n}\n\nfunction fontCompilerError(loader: string): never {\n throw new Error(\n `[Farm fonts] ${loader}() must be called at module scope with static options and compiled by the Farm Vite plugin.`,\n );\n}\n\n/**\n * Compile local font files into hashed application assets and generated CSS.\n * The call is removed at build time and adds no font-loader runtime code.\n */\nexport function localFont(_options: LocalFontOptions): FarmFont {\n return fontCompilerError(\"localFont\");\n}\n\n/**\n * Compile a remote font into a self-hosted application asset by default.\n * Use `strategy: \"external\"` only when the browser should retain the remote URL.\n */\nexport function remoteFont(_options: RemoteFontOptions): FarmFont {\n return fontCompilerError(\"remoteFont\");\n}\n"],"mappings":";;;;;AAyFO,SAAS,kBAAmD,OAAa;AAC9E,SAAO;AACT;AAFgB;AAKT,SAAS,uBACd,SAC6B;AAC7B,MAAI;AAEJ,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,OAAO,MAAO;AACnB,eAAW,EAAE,GAAG,UAAU,GAAG,OAAO,MAAM;AAAA,EAC5C;AAEA,SAAO;AACT;AAXgB;AAahB,SAAS,kBAAkB,QAAuB;AAChD,QAAM,IAAI;AAAA,IACR,gBAAgB,MAAM;AAAA,EACxB;AACF;AAJS;AAUF,SAAS,UAAU,UAAsC;AAC9D,SAAO,kBAAkB,WAAW;AACtC;AAFgB;AAQT,SAAS,WAAW,UAAuC;AAChE,SAAO,kBAAkB,YAAY;AACvC;AAFgB;","names":[]}
@@ -0,0 +1,333 @@
1
+ import {
2
+ __name
3
+ } from "./chunk-CGILA3WO.mjs";
4
+
5
+ // src/preload.ts
6
+ var DEFAULT_PRELOAD_CONFIG = {
7
+ mode: "enforce",
8
+ maxImages: 1,
9
+ maxFonts: 2
10
+ };
11
+ var reportedWarnings = /* @__PURE__ */ new Map();
12
+ var PRELOAD_WARNING_TTL_MS = 6e4;
13
+ var MAX_REPORTED_PRELOAD_WARNINGS = 256;
14
+ function resolveFarmPerformanceConfig(config) {
15
+ return {
16
+ preload: {
17
+ mode: config?.preload?.mode === "warn" ? "warn" : "enforce",
18
+ maxImages: normalizeBudget(config?.preload?.maxImages, DEFAULT_PRELOAD_CONFIG.maxImages),
19
+ maxFonts: normalizeBudget(config?.preload?.maxFonts, DEFAULT_PRELOAD_CONFIG.maxFonts)
20
+ }
21
+ };
22
+ }
23
+ __name(resolveFarmPerformanceConfig, "resolveFarmPerformanceConfig");
24
+ function manageFarmHtmlPreloads(html, config) {
25
+ const elements = findHtmlLinkElements(html);
26
+ const candidates = elements.flatMap((element, index) => {
27
+ const kind = getHtmlPreloadKind(element.value);
28
+ return kind ? [
29
+ {
30
+ index,
31
+ kind,
32
+ highPriority: readHtmlAttribute(element.value, "fetchpriority")?.toLowerCase() === "high"
33
+ }
34
+ ] : [];
35
+ });
36
+ const budget = selectPreloadsWithinBudget(candidates, config);
37
+ if (config.mode === "warn" || budget.removed.size === 0) {
38
+ return { value: html, warnings: budget.warnings };
39
+ }
40
+ return {
41
+ value: removeHtmlLinkElements(html, elements, budget.removed),
42
+ warnings: budget.warnings
43
+ };
44
+ }
45
+ __name(manageFarmHtmlPreloads, "manageFarmHtmlPreloads");
46
+ function manageFarmLinkHeaderPreloads(value, config) {
47
+ if (!value) return { value, warnings: [] };
48
+ const links = splitLinkHeader(value);
49
+ const candidates = links.flatMap((link, index) => {
50
+ const kind = getLinkHeaderPreloadKind(link);
51
+ return kind ? [
52
+ {
53
+ index,
54
+ kind,
55
+ highPriority: getLinkHeaderParameter(link, "fetchpriority")?.toLowerCase() === "high"
56
+ }
57
+ ] : [];
58
+ });
59
+ const budget = selectPreloadsWithinBudget(candidates, config);
60
+ return {
61
+ value: config.mode === "enforce" ? links.filter((_, index) => !budget.removed.has(index)).join(", ") : value,
62
+ warnings: budget.warnings
63
+ };
64
+ }
65
+ __name(manageFarmLinkHeaderPreloads, "manageFarmLinkHeaderPreloads");
66
+ function manageFarmDocumentPreloads(html, linkHeader, config) {
67
+ const elements = findHtmlLinkElements(html);
68
+ const links = linkHeader ? splitLinkHeader(linkHeader) : [];
69
+ const headerOffset = elements.length;
70
+ const candidates = [];
71
+ for (const [index, element] of elements.entries()) {
72
+ const kind = getHtmlPreloadKind(element.value);
73
+ if (!kind) continue;
74
+ candidates.push({
75
+ index,
76
+ kind,
77
+ highPriority: readHtmlAttribute(element.value, "fetchpriority")?.toLowerCase() === "high"
78
+ });
79
+ }
80
+ for (const [index, link] of links.entries()) {
81
+ const kind = getLinkHeaderPreloadKind(link);
82
+ if (!kind) continue;
83
+ candidates.push({
84
+ index: headerOffset + index,
85
+ kind,
86
+ highPriority: getLinkHeaderParameter(link, "fetchpriority")?.toLowerCase() === "high"
87
+ });
88
+ }
89
+ const budget = selectPreloadsWithinBudget(candidates, config);
90
+ if (config.mode === "warn" || budget.removed.size === 0) {
91
+ return { html, linkHeader, warnings: budget.warnings };
92
+ }
93
+ return {
94
+ html: removeHtmlLinkElements(html, elements, budget.removed),
95
+ linkHeader: links.filter((_, index) => !budget.removed.has(headerOffset + index)).join(", "),
96
+ warnings: budget.warnings
97
+ };
98
+ }
99
+ __name(manageFarmDocumentPreloads, "manageFarmDocumentPreloads");
100
+ function reportFarmPreloadWarnings(warnings, context = "the rendered document") {
101
+ const now = Date.now();
102
+ for (const [key, reportedAt] of reportedWarnings) {
103
+ if (now - reportedAt >= PRELOAD_WARNING_TTL_MS) reportedWarnings.delete(key);
104
+ }
105
+ for (const warning of warnings) {
106
+ const key = `${context}:${warning.kind}:${warning.count}:${warning.budget}:${warning.removed}`;
107
+ const reportedAt = reportedWarnings.get(key);
108
+ if (reportedAt !== void 0 && now - reportedAt < PRELOAD_WARNING_TTL_MS) continue;
109
+ reportedWarnings.set(key, now);
110
+ while (reportedWarnings.size > MAX_REPORTED_PRELOAD_WARNINGS) {
111
+ const oldest = reportedWarnings.keys().next().value;
112
+ if (oldest === void 0) break;
113
+ reportedWarnings.delete(oldest);
114
+ }
115
+ const action = warning.removed > 0 ? ` Removed ${warning.removed} lower-priority hint(s).` : "";
116
+ const recommendation = warning.kind === "image" ? ' Mark only the LCP image with `preload` or `fetchPriority="high"`.' : " Set `preload: false` on fonts that are not required above the fold.";
117
+ console.warn(
118
+ `[Farm.js] ${context} emitted ${warning.count} ${warning.kind} preload hints (budget: ${warning.budget}).${action}${recommendation}`
119
+ );
120
+ }
121
+ }
122
+ __name(reportFarmPreloadWarnings, "reportFarmPreloadWarnings");
123
+ function selectPreloadsWithinBudget(candidates, config) {
124
+ const removed = /* @__PURE__ */ new Set();
125
+ const warnings = [];
126
+ for (const kind of ["image", "font"]) {
127
+ const matching = candidates.filter((candidate) => candidate.kind === kind);
128
+ const limit = kind === "image" ? config.maxImages : config.maxFonts;
129
+ if (matching.length <= limit) continue;
130
+ const retained = new Set(
131
+ [...matching].sort(
132
+ (left, right) => Number(right.highPriority) - Number(left.highPriority) || left.index - right.index
133
+ ).slice(0, limit).map((candidate) => candidate.index)
134
+ );
135
+ if (config.mode === "enforce") {
136
+ for (const candidate of matching) {
137
+ if (!retained.has(candidate.index)) removed.add(candidate.index);
138
+ }
139
+ }
140
+ warnings.push({
141
+ kind,
142
+ count: matching.length,
143
+ budget: limit,
144
+ removed: config.mode === "enforce" ? matching.length - retained.size : 0
145
+ });
146
+ }
147
+ return { removed, warnings };
148
+ }
149
+ __name(selectPreloadsWithinBudget, "selectPreloadsWithinBudget");
150
+ function getHtmlPreloadKind(link) {
151
+ const rel = readHtmlAttribute(link, "rel")?.toLowerCase().split(/\s+/) || [];
152
+ if (!rel.includes("preload")) return void 0;
153
+ return normalizePreloadKind(readHtmlAttribute(link, "as"));
154
+ }
155
+ __name(getHtmlPreloadKind, "getHtmlPreloadKind");
156
+ function getLinkHeaderPreloadKind(link) {
157
+ const relations = getLinkHeaderParameter(link, "rel")?.toLowerCase().split(/\s+/) ?? [];
158
+ if (!relations.includes("preload")) return void 0;
159
+ return normalizePreloadKind(getLinkHeaderParameter(link, "as"));
160
+ }
161
+ __name(getLinkHeaderPreloadKind, "getLinkHeaderPreloadKind");
162
+ function getLinkHeaderParameter(link, name) {
163
+ const uriEnd = link.indexOf(">");
164
+ if (uriEnd === -1) return void 0;
165
+ for (const parameter of splitLinkParameters(link.slice(uriEnd + 1))) {
166
+ const separator = parameter.indexOf("=");
167
+ const parameterName = (separator === -1 ? parameter : parameter.slice(0, separator)).trim().toLowerCase();
168
+ if (parameterName !== name.toLowerCase() || separator === -1) continue;
169
+ const rawValue = parameter.slice(separator + 1).trim();
170
+ if (rawValue.startsWith('"') && rawValue.endsWith('"')) {
171
+ return rawValue.slice(1, -1).replace(/\\([\\"])/g, "$1");
172
+ }
173
+ return rawValue;
174
+ }
175
+ return void 0;
176
+ }
177
+ __name(getLinkHeaderParameter, "getLinkHeaderParameter");
178
+ function splitLinkParameters(value) {
179
+ const parameters = [];
180
+ let start = 0;
181
+ let quoted = false;
182
+ for (let index = 0; index < value.length; index += 1) {
183
+ const character = value[index];
184
+ if (character === '"' && !isEscaped(value, index)) quoted = !quoted;
185
+ else if (character === ";" && !quoted) {
186
+ const parameter2 = value.slice(start, index).trim();
187
+ if (parameter2) parameters.push(parameter2);
188
+ start = index + 1;
189
+ }
190
+ }
191
+ const parameter = value.slice(start).trim();
192
+ if (parameter) parameters.push(parameter);
193
+ return parameters;
194
+ }
195
+ __name(splitLinkParameters, "splitLinkParameters");
196
+ function normalizePreloadKind(value) {
197
+ const normalized = value?.toLowerCase();
198
+ return normalized === "image" || normalized === "font" ? normalized : void 0;
199
+ }
200
+ __name(normalizePreloadKind, "normalizePreloadKind");
201
+ function readHtmlAttribute(element, name) {
202
+ const match = element.match(
203
+ new RegExp(`\\s${name}\\s*=\\s*(?:"([^"]*)"|'([^']*)'|([^\\s>]+))`, "i")
204
+ );
205
+ return match?.[1] ?? match?.[2] ?? match?.[3];
206
+ }
207
+ __name(readHtmlAttribute, "readHtmlAttribute");
208
+ function findHtmlLinkElements(html) {
209
+ const elements = [];
210
+ const lowerHtml = html.toLowerCase();
211
+ let cursor = 0;
212
+ while (cursor < html.length) {
213
+ const start = html.indexOf("<", cursor);
214
+ if (start === -1) break;
215
+ if (lowerHtml.startsWith("<!--", start)) {
216
+ const commentEnd = lowerHtml.indexOf("-->", start + 4);
217
+ cursor = commentEnd === -1 ? html.length : commentEnd + 3;
218
+ continue;
219
+ }
220
+ const rawText = lowerHtml.slice(start).match(/^<(script|style|template|textarea|title|noscript|svg)(?=[\s/>])/);
221
+ if (rawText?.[1]) {
222
+ const openingEnd = findHtmlTagEnd(html, start);
223
+ if (openingEnd === -1) break;
224
+ const closingStart = findHtmlClosingTag(lowerHtml, rawText[1], openingEnd);
225
+ if (closingStart === -1) {
226
+ cursor = html.length;
227
+ continue;
228
+ }
229
+ const closingEnd = findHtmlTagEnd(html, closingStart);
230
+ cursor = closingEnd === -1 ? html.length : closingEnd;
231
+ continue;
232
+ }
233
+ if (/^<link(?=[\s/>])/i.test(html.slice(start))) {
234
+ const end = findHtmlTagEnd(html, start);
235
+ if (end === -1) break;
236
+ elements.push({ start, end, value: html.slice(start, end) });
237
+ cursor = end;
238
+ continue;
239
+ }
240
+ if (/^<\/?[A-Za-z][\w:-]*(?=[\s/>])/.test(html.slice(start))) {
241
+ const end = findHtmlTagEnd(html, start);
242
+ cursor = end === -1 ? html.length : end;
243
+ continue;
244
+ }
245
+ cursor = start + 1;
246
+ }
247
+ return elements;
248
+ }
249
+ __name(findHtmlLinkElements, "findHtmlLinkElements");
250
+ function findHtmlClosingTag(html, tagName, start) {
251
+ const prefix = `</${tagName}`;
252
+ let candidate = html.indexOf(prefix, start);
253
+ while (candidate !== -1) {
254
+ const boundary = html[candidate + prefix.length];
255
+ if (boundary === ">" || boundary === "/" || /\s/.test(boundary ?? "")) return candidate;
256
+ candidate = html.indexOf(prefix, candidate + prefix.length);
257
+ }
258
+ return -1;
259
+ }
260
+ __name(findHtmlClosingTag, "findHtmlClosingTag");
261
+ function findHtmlTagEnd(html, start) {
262
+ let quote;
263
+ for (let index = start + 1; index < html.length; index += 1) {
264
+ const character = html[index];
265
+ if (quote) {
266
+ if (character === quote) quote = void 0;
267
+ } else if (character === '"' || character === "'") {
268
+ quote = character;
269
+ } else if (character === ">") {
270
+ return index + 1;
271
+ }
272
+ }
273
+ return -1;
274
+ }
275
+ __name(findHtmlTagEnd, "findHtmlTagEnd");
276
+ function removeHtmlLinkElements(html, elements, removed) {
277
+ let cursor = 0;
278
+ let output = "";
279
+ for (const [index, element] of elements.entries()) {
280
+ if (!removed.has(index)) continue;
281
+ output += html.slice(cursor, element.start);
282
+ cursor = element.end;
283
+ }
284
+ return output + html.slice(cursor);
285
+ }
286
+ __name(removeHtmlLinkElements, "removeHtmlLinkElements");
287
+ function splitLinkHeader(value) {
288
+ const links = [];
289
+ let start = 0;
290
+ let insideAngleBrackets = false;
291
+ let quoted = false;
292
+ for (let index = 0; index < value.length; index += 1) {
293
+ const character = value[index];
294
+ if (quoted) {
295
+ if (character === '"' && !isEscaped(value, index)) quoted = false;
296
+ continue;
297
+ }
298
+ if (character === '"') {
299
+ quoted = true;
300
+ } else if (character === "<") {
301
+ insideAngleBrackets = true;
302
+ } else if (character === ">") {
303
+ insideAngleBrackets = false;
304
+ } else if (character === "," && !insideAngleBrackets) {
305
+ links.push(value.slice(start, index).trim());
306
+ start = index + 1;
307
+ }
308
+ }
309
+ links.push(value.slice(start).trim());
310
+ return links.filter(Boolean);
311
+ }
312
+ __name(splitLinkHeader, "splitLinkHeader");
313
+ function isEscaped(value, index) {
314
+ let backslashes = 0;
315
+ for (let cursor = index - 1; cursor >= 0 && value[cursor] === "\\"; cursor -= 1) {
316
+ backslashes += 1;
317
+ }
318
+ return backslashes % 2 === 1;
319
+ }
320
+ __name(isEscaped, "isEscaped");
321
+ function normalizeBudget(value, fallback) {
322
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? Math.floor(value) : fallback;
323
+ }
324
+ __name(normalizeBudget, "normalizeBudget");
325
+
326
+ export {
327
+ resolveFarmPerformanceConfig,
328
+ manageFarmHtmlPreloads,
329
+ manageFarmLinkHeaderPreloads,
330
+ manageFarmDocumentPreloads,
331
+ reportFarmPreloadWarnings
332
+ };
333
+ //# sourceMappingURL=chunk-7ZVN3YZI.mjs.map